﻿using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace Maestro_Proveedores.evaluacionDeDesempeno.indicadores
{
    /// <remarks>
    /// <para>El indicador tiene como objetivo evaluar el cumplimiento del proveedor de acuerdo al día de entrega.</para>
    /// <para>Tenga en cuenta que un signo negativo significa días anticipados, cero (0) días significa una entrega puntual y un numero positivo o mayor que cero (0) indica días de retraso.</para>
    /// </remarks>
    class CumplimientoPlazoEntrega : Indicador
    {
        private MAPICS.MAPICSDataSet mAPICSdATAsET = new MAPICS.MAPICSDataSet(); 
        private MAPICS.MAPICSDataSetTableAdapters.INF_OCTableAdapter iNF_OCTableAdapter = new MAPICS.MAPICSDataSetTableAdapters.INF_OCTableAdapter();
        
        /// <summary>
        /// Cuando se crea una nueva instancia del indicador, se incializan todas sus variables y propiedades. Tanto las propias como las herededas de la calse Indicador
        /// </summary>
        public CumplimientoPlazoEntrega()
        {
            this.Peso = 0.23;
            this.TipoIndicador = Enums.TipoIndicador.Bien;
        }
        /// <summary>
        /// Redefinicion del metodo toString()
        /// </summary>
        /// <returns>Nombre Completo del presente indicador</returns>
        public override string ToString()
        {
            return "Cumplimiento del plazo en la entrega";
        }
        /// <summary>
        /// redefinición del metodo Calcular(), declarado en la clase padre Indicador como un metodo abstracto (se debe redefinir obligatoriamente en cualquier clase que herede de la clase Indicador)
        /// </summary>
        /// <returns></returns>
        protected override bool calcular()
        {
            try
            {
//MessageBox.Show(this.iNF_OCTableAdapter.FillByCodPrv(this.mAPICSdATAsET.INF_OC,"4745").ToString());
                //--- obtengo los parametros y los datos
                decimal fechaInf = decimal.Parse(MAESTROS.ClassVarios.FechaMAPIC(this.FechaInferior));
                decimal fehcaSup = decimal.Parse(MAESTROS.ClassVarios.FechaMAPIC(this.FechaSuperior));
                double total_dias = 0;
                double total_registros = 0;
                
                //--- aqui se trae la informacion desde INFOR
                this.iNF_OCTableAdapter.FillByCodProvFechas_Entrega(this.mAPICSdATAsET.INF_OC, this.registroProveedor.id_proveedor, fechaInf, fehcaSup);
                
                //--- calculo los dias de diferencia
                foreach (MAPICS.MAPICSDataSet.INF_OCRow row in this.mAPICSdATAsET.INF_OC)
                {
                    //--- los ITEMs de las ordenes de compra con estdo 99 estan ANULADAS, por esa razon no se tienen en cuenta para realizar la evaluacion de desempeño
                    if (!MAESTROS.ClassVarios.LimpiarCadena(row.ESTADO_OC).Equals("99"))
                    {
                        DateTime fechaEsperada = MAESTROS.ClassVarios.FechaMAPIC(row.FECHA_ENTR_R.ToString());
                        //--- si ya se recibio la entrega y la fecha esperada ya paso...
                        if (!row.ULT_REC.Equals(0) && fechaEsperada <= DateTime.Now)
                        {
                            DateTime fechaReal = MAESTROS.ClassVarios.FechaMAPIC(row.ULT_REC.ToString());
                            total_dias += (fechaEsperada - fechaReal).TotalDays;
                            total_registros++;
                        }
                        //--- Si aun no se ha recibido la entrega y la fecha esperada ya paso...
                        else if (row.ULT_REC.Equals(0) && fechaEsperada <= DateTime.Now)
                        {
                            DateTime fechaReal = DateTime.Parse(DateTime.Now.ToShortDateString());
                            //-- si ya pasaron X dias desde la fecha requerida de entrega, entonces no tengo esta entrega en cuenta para calcular el resultado.
                            //-- ya que posiblemente, esta orden de compra halla sido cancelada, anulada, convertida en activo o algo asi...
                            //-- Esta excepcion se capturo por sugenrecia de Andrea GarciaHerreros
                            if ((ConfiguracionDelSistema.DiasMaximosDeRetraso + (fechaEsperada - fechaReal).TotalDays) >= 0)
                            {
                                total_dias += (fechaEsperada - fechaReal).TotalDays;
                                total_registros++;
                            }
                            else
                            {
                                // MessageBox.Show(this.ToString() + "\n" + total_registros + "\nDias de diferencia: " + (fechaEsperada - fechaReal).TotalDays);
                            }
                        }
                        else
                        {
                            //MessageBox.Show("DESCARTADO.\n"+total_registros + "\ncod_oc " + row.COD_OC + "\nnum_item " + row.NUM_ITEM + "\ncan_entreg " + row.CAN_ENTR + "\ncan_dev " + row.CAN_DEV + "\nfecha_max " + row.FECHA_ENTR_R + "\ncan_sol " + row.CAN_SOL + "\nprv " + row.COD_PRV);
                            //--- aquellos ITEM's para los que no se halla registrado una fecha de entrega (ultima_fecha_entrega=0),
                            //--- pero que no se les halla vencido el plazo de entrega no seran tenidos en cuenta en este criterio.
                        }
                    }
                }

                //--- si no hay registros el indicador no aplica

                if (total_registros == 0)
                {
                    return false;
                }

                //MessageBox.Show(this.ToString() + "\n\n" + total_dias + " / " + total_registros + " = " + total_dias / total_registros);

                //--- Guardo el resultado del indicador
                //this.Resultado = double.Parse((int.Parse((total_dias / total_registros).ToString())).ToString());
                this.Resultado = Math.Round((total_dias / total_registros),0);
                
               // MessageBox.Show(this.Resultado.ToString());
                //--- calculo los dias promedio y aplico la definicion del Indicador (consultar Proyecto: sistema_gestion_de_proveedores_2009)

                if (this.Resultado > (-1))
                {
                    this.PorcentajeEvaluacion = 100;
                }
                else if (this.Resultado > (-3))
                {
                    this.PorcentajeEvaluacion = 75;
                }
                else if (this.Resultado > (-6))
                {
                    this.PorcentajeEvaluacion = 50;
                }
                else
                {
                    this.PorcentajeEvaluacion = 25;
                }
                return true;
            }
            catch (Exception ex)
            {
                Maestro_Proveedores.herramientas.MessageException.show(ex);
                System.Windows.Forms.MessageBox.Show("CumplimientoPlazoEntrega.calcular()");
                return false;
            }
        }
    }
}